<?php
// 全局mysql的一些操作功能 简化操作

/**
 * 全局的数据库操作类 mysqli
 */
$mysqli = null;

/**
 * 连接数据库
 * @param $dbPara 数据库参数 参考cfg.class.php
 */
function db_connect(&$dbPara)
{
    global $mysqli;
    if (is_null($mysqli) || $mysqli->connect_errno) {
        $mysqli = new mysqli($dbPara["host"], $dbPara["username"], $dbPara["password"], $dbPara["dbname"]);
        if ($mysqli->connect_errno) {
            echo "Failed to connect to MySQL: " . $mysqli->connect_error;
            exit();
        }
        $mysqli->set_charset($dbPara["charset"]);
    }
}

/**
 * 开始事务
 */
function db_begin()
{
    global $mysqli;
    $mysqli->autocommit(FALSE);
}

/**
 * 提交事务
 */
function db_commit()
{
    global $mysqli;
    $mysqli->autocommit(TRUE);
}

/**
 * 事务回滚 并返回错误信息
 */
function db_rollback()
{
    global $mysqli;
    $error = $mysqli->error;
    $mysqli->rollback();
    $mysqli->autocommit(true);
    return $error;
}

/**
 * 返回错误信息
 */
function db_error()
{
    global $mysqli;
    return $mysqli->error;
}

/**
 * 返回错误代码
 */
function db_errno()
{
    global $mysqli;
    return $mysqli->errno;
}

/**
 * 返回先前sql的影响行数
 */
function db_affected_rows()
{
    global $mysqli;
    return $mysqli->affected_rows;
}

/**
 * 执行sql指令 返回结果
 */
function db_query($sql_str)
{
    global $mysqli;
    return $mysqli->query($sql_str);
}

/**
 * 返回最近插入的id
 */
function db_insert_id()
{
    global $mysqli;
    return $mysqli->insert_id;
}

/**
 * 数据库的查询结果，获取对象列表 成功返回1 失败返回0
 * @param object $result 查询结果
 * @param array $list 返回对象列表
 */
function db_fetch_list(&$result, &$list)
{
    $list = array();
    while ($row = $result->fetch_object()) {
        $list[] = $row;
    }
    return 1;
}

/**
 * 数据库的查询结果，获取对象 成功返回1 失败返回0
 * @param object $result 查询结果
 * @param object $object 返回对象
 */
function db_fetch_object(&$result, &$object)
{
    if ($row = $result->fetch_object()) {
        $object = $row;
        return 1;
    } else {
        return 0;
    }
}

/**
 * 数据库的查询结果，获取数组 成功返回1 失败返回0
 * @param object $result 查询结果
 * @param array $object 返回数组
 */
function db_fetch_array(&$result, &$array)
{
    if ($row = $result->fetch_array()) {
        $array = $row;
        return 1;
    } else {
        return 0;
    }
}

/**
 * 数据库的获取一个数据，成功返回1 没查询到结果返回0 失败返回错误信息
 * @param object $table 数据表名
 * @param string $field 字段名
 * @param string $key 查询条件的字段名
 * @param mix $value 查询条件的字段名对应的值 如果查询成功 返回获取值
 */
function db_get_data($table, $field, $key, &$value)
{
    global $mysqli;
    $sql_str = "SELECT `$field` FROM `{$table}`
                WHERE `{$key}` = {$value}";
    $result = db_query($sql_str);
    if ($result === FALSE) return db_error();
    if ($result->num_rows === 0) return 0;
    if ($row = $result->fetch_array()) {
        $value = $row[0];
    }
    return 1;
}

/**
 * 数据库的获取一个数据对象（一行数据, 对象的属性名为数据库中的字段名）.
 * 成功返回对象 没查询到结果返回0 失败返回错误信息
 * @param string $table 数据表名
 * @param string $field 字段名
 * @param string $key 查询条件的字段名
 * @param mix $value 查询条件的字段名对应的值
 */
function db_get_object($table, $key, $value)
{
    global $mysqli;
    $sql_str = "SELECT * FROM `{$table}`
                WHERE `{$key}` = '{$value}'";
    $result = db_query($sql_str);
    if ($result === FALSE) return db_error();
    if ($result->num_rows === 0) return 0;
    return $result->fetch_object();
}

/**
 * 执行 SQL 语句, 返回结果的第一条记录(是一个对象).
 * 如果失败 返回错误信息 如果没有找到记录 返回0
 */
function db_get_object2($sql_str)
{
    $result = db_query($sql_str);
    if ($result === FALSE) return db_error();
    if (db_fetch_object($result, $row) === 1) {
        return $row;
    } else {
        return 0;
    }
}

/**
 * 更新一个数据对象（一行数据, 对象的属性名或数组的索引名为数据库中的字段名）.
 * 成功返回TRUE 失败返回错误信息.
 * @param string $table 数据表名.
 * @param array|object $row 更新的数据.
 * @param string $key 更新条件的字段名.
 */
function db_update($table, &$row, $key = 'Id')
{
    $sqlA = '';
    foreach ($row as $k => $v) {
        if ($k != $key) {
            $sqlA .= "`$k` = $v,";
        }
    }
    // 删除掉最后一个逗号
    $sqlA = substr($sqlA, 0, strlen($sqlA) - 1);
    if (is_object($row)) {
        $id = $row->{$key};
    } else if (is_array($row)) {
        $id = $row[$key];
    }
    $sql = "UPDATE `{$table}` SET $sqlA WHERE `{$key}`='{$id}'";
    $result = db_query($sql);
    if ($result === FALSE) return db_error();
    else return TRUE;
}

/**
 * 保存一条id自增的记录，并返回id.
 * 如果执行错误 则返回错误信息
 * @param string $table 数据表名
 * @param array|object $row 需要插入的数据
 */
function db_save($table, &$row)
{
    $sqlA = '';
    foreach ($row as $k => $v) {
        $sqlA .= "`$k` = $v,";
    }
    $sqlA = substr($sqlA, 0, strlen($sqlA) - 1);
    $sql = "INSERT INTO `{$table}` SET {$sqlA}";
    $result = db_query($sql);
    if ($result !== true) return db_error();
    return db_insert_id();
}

/**
 * mysql的特殊字符转义.
 * 如果成功，则该函数返回被转义的字符串。如果失败，则返回 false。
 * @param string $value 需要转义的字符串
 */
function db_escape($value)
{
    global $mysqli;
    return $mysqli->escape_string($value);
}